package net.sf.rose.web.util;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.core.LocalVariableTableParameterNameDiscoverer;

import net.sf.rose.util.ClassUtils;

public class ClassUtil {

	/**
	 * Class<?>是类定义
	 * String是方法名称
	 * String[0]是形参名称
	 * String[1]是形参Java数据类型
	 */
	private static Map<Class<?>, Map<String, List<String[]>>> classCacheMap = new HashMap<>();

	/**
	 * 根据指定的类和方法名称，返回对应方法的形参名称和形参数据类型的列表
	 * String[0]是形参名称
	 * String[1]是形参Java数据类型
	 * @param clazz
	 * @param methodName
	 * @return
	 */
	public static List<String[]> getParamterDefine(Class<?> clazz, String methodName) {
		List<String[]> list = null;
		Map<String, List<String[]>> map = classCacheMap.get(clazz);
		if (map != null) {
			list = map.get(methodName);
			if (list != null) {
				return list;
			}
		} else {
			map = new HashMap<>();
		}
		list = new ArrayList<>();
		Method method = ClassUtils.getMethod(clazz, methodName);
		String[] params = new LocalVariableTableParameterNameDiscoverer().getParameterNames(method);
		Type[] ts = method.getGenericParameterTypes();
		for (int i = 0; i < ts.length; i++) {
			String[] arr = new String[2];
			arr[0] = params[i];
			arr[1] = ts[i].getTypeName();
			list.add(arr);
		}
		map.put(methodName, list);
		return list;
	}
}
